ã¯ãã¹ãã©ãããã©ãŒã ã®ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã«ãããããã©ãŒãã³ã¹åäžã®ããWebGLé ç¹ã·ã§ãŒããŒãæé©åãã倿§ãªããã€ã¹ãå°åã§ã¹ã ãŒãºãªã¬ã³ããªã³ã°ãå®çŸããŸãã
WebGLãžãªã¡ããªåŠçãŠãããïŒã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ããã®é ç¹ã·ã§ãŒããŒæé©å
ã¯ãŒã«ãã»ã¯ã€ãã»ãŠã§ãã®é²åã¯ãç§ãã¡ãæ å ±ãä»è ãšå¯Ÿè©±ããæ¹æ³ãå€é©ããŠããŸããããŠã§ãããŸããŸããªããã§ã€ã³ã¿ã©ã¯ãã£ãã«ãªãã«ã€ããŠã髿§èœãªã°ã©ãã£ãã¯ã¹ãžã®èŠæ±ãæ¥å¢ããŠããŸããWebGLã¯ããã©ã°ã€ã³ã䜿çšããã«ãäºææ§ã®ãããŠã§ããã©ãŠã¶å ã§ã€ã³ã¿ã©ã¯ãã£ããª2Dããã³3Dã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ããããã®JavaScript APIã§ãããéèŠãªæè¡ãšããŠæµ®äžããŠããŸãããã®ããã°èšäºã§ã¯ãWebGLã®ãžãªã¡ããªåŠçãã€ãã©ã€ã³ã®åºç€ã§ããé ç¹ã·ã§ãŒããŒã®æé©åã«ã€ããŠæãäžããããŸããŸãªããã€ã¹ãå°åã«ãããã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã§æé©ãªããã©ãŒãã³ã¹ãéæããããšã«çŠç¹ãåœãŠãŸãã
WebGLãžãªã¡ããªåŠçãã€ãã©ã€ã³ã®çè§£
é ç¹ã·ã§ãŒããŒã®æé©åã«é£ã³èŸŒãåã«ãWebGLã®ãžãªã¡ããªåŠçãã€ãã©ã€ã³å šäœãçè§£ããããšãéèŠã§ãããã®ãã€ãã©ã€ã³ã¯ãã·ãŒã³ãå®çŸ©ãã3DããŒã¿ãç»é¢ã«è¡šç€ºããã2Dãã¯ã»ã«ã«å€æãã圹å²ãæ ã£ãŠããŸããäž»èŠãªã¹ããŒãžã¯æ¬¡ã®ãšããã§ãïŒ
- é ç¹ã·ã§ãŒããŒïŒ åã ã®é ç¹ãåŠçãããã®äœçœ®ã倿ããããæ³ç·ãèšç®ãããããã®ä»ã®é ç¹åºæã®æäœãé©çšããŸãããããç§ãã¡ã®æé©ååªåã®çŠç¹ãšãªããŸãã
- ããªããã£ãã¢ã»ã³ããªïŒ é ç¹ã幟äœåŠçãªããªããã£ãïŒäŸïŒç¹ãç·ãäžè§åœ¢ïŒã«çµã¿ç«ãŠãŸãã
- ãžãªã¡ããªã·ã§ãŒããŒïŒãªãã·ã§ã³ïŒïŒ ããªããã£ãå šäœãæäœããæ°ãããžãªã¡ããªã®äœæãæ¢åã®ãžãªã¡ããªã®å€æŽãå¯èœã«ããŸãã
- ã©ã¹ã¿ã©ã€ãºïŒ ããªããã£ãããã©ã°ã¡ã³ãïŒãã¯ã»ã«ïŒã«å€æããŸãã
- ãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒ åã ã®ãã©ã°ã¡ã³ããåŠçãããã®è²ããã®ä»ã®ããããã£ã決å®ããŸãã
- åºåããŒãžïŒ ãã©ã°ã¡ã³ãã®è²ãæ¢åã®ãã¬ãŒã ãããã¡ã®ã³ã³ãã³ããšçµåããŸãã
é ç¹ã·ã§ãŒããŒã¯ã倧éã®ããŒã¿ã®äžŠååŠçã«ç¹åããŠèšèšãããã°ã©ãã£ãã¯ã¹ããã»ãã·ã³ã°ãŠãããïŒGPUïŒã§å®è¡ãããããããã®ã¿ã¹ã¯ã«çæ³çã§ããé ç¹ã·ã§ãŒããŒã®å¹çã¯ãã¬ã³ããªã³ã°å šäœã®ããã©ãŒãã³ã¹ã«çŽæ¥åœ±é¿ããŸããé ç¹ã·ã§ãŒããŒãæé©åããããšã§ãç¹ã«è€éãª3Dã·ãŒã³ã«ãããŠãã¬ãŒã ã¬ãŒããåçã«åäžãããããšãã§ããããã¯ããã€ã¹ã®æ§èœã倧ããç°ãªãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã察象ãšããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠç¹ã«éèŠã§ãã
é ç¹ã·ã§ãŒããŒïŒè©³çŽ°è§£èª¬
é ç¹ã·ã§ãŒããŒã¯ãWebGLãã€ãã©ã€ã³ã®ããã°ã©ããã«ãªã¹ããŒãžã§ããäœçœ®ãæ³ç·ããã¯ã¹ãã£åº§æšããã®ä»ã®ã«ã¹ã¿ã 屿§ãªã©ãé ç¹ããšã®ããŒã¿ãå ¥åãšããŠåãåããŸããé ç¹ã·ã§ãŒããŒã®äž»ãªè²¬åã¯ãé ç¹ã®äœçœ®ããªããžã§ã¯ã空éããã¯ãªãã空éã«å€æããããšã§ããã¯ãªãã空éã¯ãGPUã衚瀺é åå€ã®ãã©ã°ã¡ã³ããã¯ãªããã³ã°ïŒç Žæ£ïŒããããã«äœ¿çšãã座æšç³»ã§ãã倿ãããé ç¹ã®äœçœ®ã¯ããã€ãã©ã€ã³ã®æ¬¡ã®ã¹ããŒãžã«æž¡ãããŸãã
é ç¹ã·ã§ãŒããŒããã°ã©ã ã¯ãOpenGL Shading LanguageïŒGLSLïŒã®ãµãã»ããã§ããOpenGL ES Shading LanguageïŒGLSL ESïŒã§èšè¿°ãããŸãããã®èšèªã«ãããéçºè ã¯é ç¹ã®åŠçæ¹æ³ãå¶åŸ¡ã§ããããã§ããã©ãŒãã³ã¹ã®æé©åãéèŠã«ãªããŸãããã®ã·ã§ãŒããŒã®å¹çãããžãªã¡ããªãã©ãã ãéãæç»ãããããæ±ºå®ããŸããããã¯åãªãèŠãç®ã®åé¡ã§ã¯ãããŸãããç¹ã«ã€ã³ã¿ãŒãããæ¥ç¶ãé ããŠãŒã¶ãŒãå€ãããŒããŠã§ã¢ã䜿çšããŠãããŠãŒã¶ãŒã«ãšã£ãŠã¯ãããã©ãŒãã³ã¹ããŠãŒã¶ããªãã£ã«åœ±é¿ããŸãã
äŸïŒåºæ¬çãªé ç¹ã·ã§ãŒããŒ
以äžã¯ãGLSL ESã§èšè¿°ãããé ç¹ã·ã§ãŒããŒã®ç°¡åãªäŸã§ãïŒ
#version 300 es
layout (location = 0) in vec4 a_position;
uniform mat4 u_modelViewMatrix;
uniform mat4 u_projectionMatrix;
out vec4 v_color;
void main() {
gl_Position = u_projectionMatrix * u_modelViewMatrix * a_position;
v_color = vec4(a_position.xyz, 1.0);
}
解説ïŒ
#version 300 es: OpenGL ESã®ããŒãžã§ã³ãæå®ããŸããlayout (location = 0) in vec4 a_position: é ç¹äœçœ®ãä¿æããå ¥å屿§a_positionã宣èšããŸããlayout (location = 0)ã¯å±æ§ã®äœçœ®ãæå®ããé ç¹ããŒã¿ãã·ã§ãŒããŒã«ãã€ã³ãããããã«äœ¿çšãããŸããuniform mat4 u_modelViewMatrixããã³uniform mat4 u_projectionMatrix: uniform倿°ã宣èšããŸããããã¯ã1åã®æç»ã³ãŒã«å ã§ãã¹ãŠã®é ç¹ã«å¯ŸããŠäžå®ã®å€ã§ãããããã¯å€æã«äœ¿çšãããŸããout vec4 v_color: ãã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ãããåºåvarying倿°ã宣èšããŸããgl_Position = u_projectionMatrix * u_modelViewMatrix * a_position: ãã®è¡ã¯ãé ç¹äœçœ®ã®äž»èŠãªå€æãå®è¡ããŸããäœçœ®ã«ã¢ãã«ãã¥ãŒè¡åãšå°åœ±è¡åãä¹ç®ããŠãã¯ãªãã空éã«å€æããŸããv_color = vec4(a_position.xyz, 1.0): åºåè²ïŒãã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ãããïŒãèšå®ããŸãã
é ç¹ã·ã§ãŒããŒã®æé©åãã¯ããã¯
é ç¹ã·ã§ãŒããŒã®æé©åã«ã¯ãã³ãŒãã¬ãã«ã®æ¹åããã¢ãŒããã¯ãã£äžã®èæ ®äºé ãŸã§ãããŸããŸãªãã¯ããã¯ãå«ãŸããŸãã以äžã¯ãæã广çãªã¢ãããŒãã®äžéšã§ãïŒ
1. èšç®ãæå°éã«æãã
é ç¹ã·ã§ãŒããŒå ã§å®è¡ãããèšç®ã®æ°ãæžãããŸããGPUã¯é ç¹ããšã«éãããæ°ã®æŒç®ããå®è¡ã§ããŸãããäžèŠãªèšç®ã¯ããã©ãŒãã³ã¹ã«çŽæ¥åœ±é¿ããŸããããã¯ç¹ã«ã¢ãã€ã«ããã€ã¹ãå€ãããŒããŠã§ã¢ã§éèŠã§ãã
- åé·ãªèšç®ã®æé€ïŒ å€ãè€æ°å䜿çšãããå Žåã¯ãäºåã«èšç®ããŠå€æ°ã«æ ŒçŽããŸãã
- è€éãªåŒã®åçŽåïŒ è€éãªæ°åŒãåçŽåããæ©äŒãæ¢ããŸããäŸãã°ã
dot()ãcross()ãnormalize()ã®ãããªçµã¿èŸŒã¿é¢æ°ã¯é«åºŠã«æé©åãããŠããããšãå€ããããé©åã«äœ¿çšããŸãã - äžèŠãªè¡åæŒç®ã®åé¿ïŒ è¡åã®ä¹ç®ã¯èšç®ã³ã¹ããé«ãã§ããè¡åã®ä¹ç®ãå³å¯ã«å¿ èŠã§ãªãå Žåã¯ã代æ¿ã¢ãããŒããæ€èšããŸãã
äŸïŒæ³ç·èšç®ã®æé©å
ã¢ãã«ãã¹ã±ãŒãªã³ã°å€æãåããªãå Žåãã·ã§ãŒããŒå ã§æ£èŠåãããæ³ç·ãèšç®ãã代ããã«ãäºåã«èšç®ããŠæ£èŠåãããæ³ç·ãé ç¹å±æ§ãšããŠã·ã§ãŒããŒã«æž¡ããŸããããã«ãããã·ã§ãŒããŒå ã®é«ã³ã¹ããªæ£èŠåã¹ããããäžèŠã«ãªããŸãã
2. Uniformã®äœ¿çšãæžãã
Uniformã¯ãæç»ã³ãŒã«å šäœã§äžå®ã«ä¿ããã倿°ã§ããã¢ãã«è¡åã®ãããªããŒã¿ãæž¡ãããã«äžå¯æ¬ ã§ãããé床ã®äœ¿çšã¯ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããGPUã¯åæç»ã³ãŒã«ã®åã«uniformãæŽæ°ããå¿ èŠããããéå°ãªuniformã®æŽæ°ã¯ããã«ããã¯ã«ãªãããšããããŸãã
- æç»ã³ãŒã«ã®ãããåŠçïŒ å¯èœãªéããæç»ã³ãŒã«ããããåŠçããŠãuniformã®å€ãæŽæ°ããå¿ èŠãããåæ°ãæžãããŸããåãã·ã§ãŒããŒãšãããªã¢ã«ãæã€è€æ°ã®ãªããžã§ã¯ããåäžã®æç»ã³ãŒã«ã«ãŸãšããŸãã
- Uniformã®ä»£ããã«Varyingã䜿çšããïŒ å€ãé ç¹ã·ã§ãŒããŒã§èšç®ã§ããããªããã£ãå šäœã§è£éã§ããå Žåã¯ãuniformã䜿çšãã代ããã«ãvarying倿°ãšããŠãã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ãããšãæ€èšããŸãã
- UniformæŽæ°ã®æé©åïŒ uniformã®æŽæ°ãã°ã«ãŒãåããŠæŽçããŸããç¹å®ã®ã·ã§ãŒããŒã®ãã¹ãŠã®uniformãäžåºŠã«æŽæ°ããŸãã
3. é ç¹ããŒã¿ã®æé©å
é ç¹ããŒã¿ã®æ§é ãšç·šæã¯éåžžã«éèŠã§ããããŒã¿ã®æ§é åã®æ¹æ³ã¯ããã€ãã©ã€ã³å šäœã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããããŒã¿ã®ãµã€ãºãšé ç¹ã·ã§ãŒããŒã«æž¡ããã屿§ã®æ°ãæžããããšã¯ãå€ãã®å Žåãããé«ãããã©ãŒãã³ã¹ã«ã€ãªãããŸãã
- 屿§ãå°ãªãããïŒ å¿ èŠãªé ç¹å±æ§ã®ã¿ãæž¡ããŸããäžèŠãªå±æ§ã¯ããŒã¿è»¢éã®ãªãŒããŒããããå¢å ãããŸãã
- ã³ã³ãã¯ããªããŒã¿åã䜿çšããïŒ ããŒã¿ãæ£ç¢ºã«è¡šçŸã§ããæå°ã®ããŒã¿åãéžæããŸãïŒäŸïŒ
floatvs.vec4ïŒã - é ç¹ãããã¡ãªããžã§ã¯ãïŒVBOïŒã®æé©åãæ€èšããïŒ VBOãé©åã«äœ¿çšããããšã§ãGPUãžã®ããŒã¿è»¢éã®å¹çãå€§å¹ ã«åäžãããããšãã§ããŸããã¢ããªã±ãŒã·ã§ã³ã®ããŒãºã«åºã¥ããŠãVBOã®æé©ãªäœ¿çšãã¿ãŒã³ãæ€èšããŸãã
äŸïŒããã¯ãããããŒã¿æ§é ã®äœ¿çšïŒ ããŒã¿ãèš±ããªããäœçœ®ãæ³ç·ããã¯ã¹ãã£åº§æšã«3ã€ã®å¥ã ã®å±æ§ã䜿çšãã代ããã«ãããããåäžã®ããŒã¿æ§é ã«ããã¯ããããšãæ€èšããŠãã ãããããã«ãããããŒã¿è»¢éã®ãªãŒããŒããããæå°éã«æããããŸãã
4. çµã¿èŸŒã¿é¢æ°ã掻çšãã
OpenGL ESã¯ãé«åºŠã«æé©åãããè±å¯ãªçµã¿èŸŒã¿é¢æ°ã»ãããæäŸããŠããŸãããããã®é¢æ°ãå©çšããããšã¯ãå€ãã®å Žåãèªäœã®å®è£ ãããå¹ççãªã³ãŒãã«ã€ãªãããŸãã
- çµã¿èŸŒã¿ã®æ°åŠé¢æ°ã䜿çšããïŒ äŸãã°ã
normalize()ãdot()ãcross()ãsin()ãcos()ãªã©ã䜿çšããŸãã - ã«ã¹ã¿ã 颿°ãé¿ããïŒå¯èœãªå ŽåïŒïŒ ã¢ãžã¥ãŒã«æ§ã¯éèŠã§ãããã«ã¹ã¿ã 颿°ã¯ãªãŒããŒããããå°å ¥ããããšããããŸããå¯èœã§ããã°ãçµã¿èŸŒã¿ã®ä»£æ¿ææ®µã«çœ®ãæããŸãã
5. ã³ã³ãã€ã©ã®æé©å
GLSL ESã³ã³ãã€ã©ã¯ãã·ã§ãŒããŒã³ãŒãã«å¯ŸããŠããŸããŸãªæé©åãå®è¡ããŸãããã ããèæ ®ãã¹ãç¹ãããã€ããããŸãïŒ
- ã³ãŒããåçŽåããïŒ ã¯ãªãŒã³ã§ããæ§é åãããã³ãŒãã¯ãã³ã³ãã€ã©ããã广çã«æé©åããã®ã«åœ¹ç«ã¡ãŸãã
- åå²ãé¿ããïŒå¯èœãªå ŽåïŒïŒ åå²ã¯ãã³ã³ãã€ã©ãç¹å®ã®æé©åãå®è¡ããã®ã劚ããããšããããŸããå¯èœã§ããã°ãåå²ãé¿ããããã«ã³ãŒããåé 眮ããŸãã
- ã³ã³ãã€ã©åºæã®åäœãçè§£ããïŒ ã¿ãŒã²ããGPUã®ã³ã³ãã€ã©ãå®è¡ããç¹å®ã®æé©åã¯ç°ãªãå ŽåããããããããããèªèããŠãããŸãã
6. ããã€ã¹åºæã®èæ ®äºé
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã¯ããã€ãšã³ãã®ãã¹ã¯ãããããäœæ¶è²»é»åã®æºåž¯é»è©±ãŸã§ãå€çš®å€æ§ãªããã€ã¹ã§å®è¡ãããããšããããããŸãã以äžã®ããã€ã¹åºæã®æé©åãæ€èšããŠãã ããïŒ
- ããã©ãŒãã³ã¹ã®ãããã¡ã€ãªã³ã°ïŒ ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãããŸããŸãªããã€ã¹ã§ã®ããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãã
- é©å¿çãªã·ã§ãŒããŒã®è€éãïŒ ããã€ã¹ã®èœåã«åºã¥ããŠã·ã§ãŒããŒã®è€éãã軜æžãããã¯ããã¯ãå®è£ ããŸããäŸãã°ãå€ãããã€ã¹åãã«ãäœå質ãã¢ãŒããæäŸããŸãã
- ããŸããŸãªããã€ã¹ã§ãã¹ãããïŒ ããŸããŸãªå°åïŒäŸïŒã€ã³ãããã©ãžã«ãæ¥æ¬ã§äººæ°ã®ããã€ã¹ïŒã®å€æ§ãªããã€ã¹ã»ããã§ã¢ããªã±ãŒã·ã§ã³ãå³å¯ã«ãã¹ãããäžè²«ããããã©ãŒãã³ã¹ã確ä¿ããŸãã
- ã¢ãã€ã«åºæã®æé©åãæ€èšããïŒ ã¢ãã€ã«GPUã¯ããã¹ã¯ãããGPUãšã¯ç°ãªãããã©ãŒãã³ã¹ç¹æ§ãæã€ããšããããããŸãããã¯ã¹ãã£ãã§ããã®æå°åããªãŒããŒãããŒã®åæžãé©åãªããŒã¿åœ¢åŒã®äœ¿çšãªã©ã®ãã¯ããã¯ãéèŠã§ãã
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ããã®ãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«éçºããå Žåãæé©ãªããã©ãŒãã³ã¹ãšããžãã£ããªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã確ä¿ããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãäžå¯æ¬ ã§ãïŒ
1. ã¯ãã¹ãã©ãããã©ãŒã äºææ§
ã¢ããªã±ãŒã·ã§ã³ãç°ãªããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããŠã§ããã©ãŠã¶ãããŒããŠã§ã¢æ§æã§äžè²«ããŠæ©èœããããšã確èªããŠãã ãããWebGLã¯ã¯ãã¹ãã©ãããã©ãŒã åãã«èšèšãããŠããŸãããGPUãã©ã€ããå®è£ ã®åŸ®åŠãªéããåé¡ãåŒãèµ·ããããšããããŸããã¿ãŒã²ãããªãŒãã£ãšã³ã¹ã䜿çšããæãäžè¬çãªãã©ãããã©ãŒã ãããã€ã¹ã§åŸ¹åºçã«ãã¹ãããŠãã ããã
2. ãããã¯ãŒã¯ã®æé©å
ããŸããŸãªå°åã®ãŠãŒã¶ãŒã®ãããã¯ãŒã¯ç¶æ³ãèæ ®ããŠãã ãããã¢ããªã±ãŒã·ã§ã³ãæé©åããŠããŒã¿è»¢éãæå°éã«æããé«ãé å»¶ãé©åã«åŠçããŸããããã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- ã¢ã»ããèªã¿èŸŒã¿ã®æé©åïŒ ãã¯ã¹ãã£ãã¢ãã«ãå§çž®ããŠãã¡ã€ã«ãµã€ãºãåæžããŸããã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯ïŒCDNïŒã䜿çšããŠã¢ã»ãããã°ããŒãã«ã«é ä¿¡ããããšãæ€èšããŸãã
- ããã°ã¬ãã·ãããŒãã£ã³ã°ã®å®è£ ïŒ ã¢ã»ãããæ®µéçã«èªã¿èŸŒãããšã§ãé ãæ¥ç¶ã§ãæåã®ã·ãŒã³ãè¿ éã«èªã¿èŸŒãŸããããã«ããŸãã
- äŸåé¢ä¿ã®æå°åïŒ èªã¿èŸŒãå€éšã©ã€ãã©ãªããªãœãŒã¹ã®æ°ãæžãããŸãã
3. åœéåãšããŒã«ã©ã€ãŒãŒã·ã§ã³
ã¢ããªã±ãŒã·ã§ã³ãè€æ°ã®èšèªãšæåçãªå¥œã¿ããµããŒãããããã«èšèšãããŠããããšã確èªããŠãã ãããããã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- ããã¹ãã¬ã³ããªã³ã°ïŒ Unicodeã䜿çšããŠãå¹ åºãæåã»ããããµããŒãããŸããããŸããŸãªèšèªã§ããã¹ãã¬ã³ããªã³ã°ããã¹ãããŸãã
- æ¥ä»ãæå»ãæ°å€åœ¢åŒïŒ æ¥ä»ãæå»ãæ°å€ã®åœ¢åŒããŠãŒã¶ãŒã®ãã±ãŒã«ã«åãããŸãã
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹èšèšïŒ ç°ãªãæåã®ãŠãŒã¶ãŒã«ãšã£ãŠçŽæçã§ã¢ã¯ã»ã¹ãããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãèšèšããŸãã
- é貚ãµããŒãïŒ é貚æç®ãé©åã«åŠçããéé¡ãæ£ãã衚瀺ããŸãã
4. ããã©ãŒãã³ã¹ç£èŠãšåæ
ããã©ãŒãã³ã¹ç£èŠããã³åæããŒã«ãå®è£ ããŠãããŸããŸãªããã€ã¹ãå°ççå°åã§ã®ããã©ãŒãã³ã¹ã¡ããªã¯ã¹ã远跡ããŸããããã«ãããæé©åã®é åãç¹å®ãããŠãŒã¶ãŒã®è¡åã«é¢ããæŽå¯ãåŸãããšãã§ããŸãã
- ãŠã§ãåæããŒã«ã®äœ¿çšïŒ ãŠã§ãåæããŒã«ïŒäŸïŒGoogle AnalyticsïŒãçµ±åããŠããŠãŒã¶ãŒã®è¡åãšããã€ã¹æ å ±ã远跡ããŸãã
- ãã¬ãŒã ã¬ãŒãã®ç£èŠïŒ ããŸããŸãªããã€ã¹ã§ãã¬ãŒã ã¬ãŒãã远跡ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãã
- ã·ã§ãŒããŒããã©ãŒãã³ã¹ã®åæïŒ ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãé ç¹ã·ã§ãŒããŒã®ããã©ãŒãã³ã¹ãåæããŸãã
5. é©å¿æ§ãšã¹ã±ãŒã©ããªãã£
é©å¿æ§ãšã¹ã±ãŒã©ããªãã£ã念é ã«çœ®ããŠã¢ããªã±ãŒã·ã§ã³ãèšèšããŠãã ããã以äžã®åŽé¢ãèæ ®ããŠãã ããïŒ
- ã¢ãžã¥ã©ãŒã¢ãŒããã¯ãã£ïŒ ã¢ããªã±ãŒã·ã§ã³ãç°¡åã«æŽæ°ããã³æ¡åŒµã§ããã¢ãžã¥ã©ãŒã¢ãŒããã¯ãã£ãèšèšããŸãã
- åçãªã³ã³ãã³ãèªã¿èŸŒã¿ïŒ ãŠãŒã¶ãŒããŒã¿ããããã¯ãŒã¯ç¶æ³ã®å€åã«é©å¿ããããã«ãåçãªã³ã³ãã³ãèªã¿èŸŒã¿ãå®è£ ããŸãã
- ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒãªãã·ã§ã³ïŒïŒ èšç®éã®å€ãã¿ã¹ã¯ã«ã€ããŠã¯ãã¯ã©ã€ã¢ã³ãåŽã®è² è·ã軜æžããããã«ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ã®äœ¿çšãæ€èšããŸãã
å®è·µçãªäŸ
ããã€ãã®æé©åãã¯ããã¯ãå ·äœçãªäŸã§ç€ºããŸãããïŒ
äŸ1ïŒã¢ãã«ã»ãã¥ãŒã»ãããžã§ã¯ã·ã§ã³ïŒMVPïŒè¡åã®äºåèšç®
å€ãã®å ŽåãMVPè¡åã¯ãã¬ãŒã ããšã«1åèšç®ããã ãã§æžã¿ãŸããJavaScriptã§èšç®ããçµæã®è¡åãuniformãšããŠé ç¹ã·ã§ãŒããŒã«æž¡ããŸããããã«ãããã·ã§ãŒããŒå ã§å®è¡ãããèšç®ãæå°éã«æããããŸãã
JavaScriptïŒäŸïŒïŒ
// In your JavaScript rendering loop
const modelMatrix = // calculate model matrix
const viewMatrix = // calculate view matrix
const projectionMatrix = // calculate projection matrix
const mvpMatrix = projectionMatrix.multiply(viewMatrix).multiply(modelMatrix);
gl.uniformMatrix4fv(mvpMatrixUniformLocation, false, mvpMatrix.toFloat32Array());
é ç¹ã·ã§ãŒããŒïŒç°¡ç¥çïŒïŒ
#version 300 es
layout (location = 0) in vec4 a_position;
uniform mat4 u_mvpMatrix;
void main() {
gl_Position = u_mvpMatrix * a_position;
}
äŸ2ïŒãã¯ã¹ãã£åº§æšèšç®ã®æé©å
åçŽãªãã¯ã¹ãã£ãããã³ã°ãå®è¡ããŠããå Žåãé ç¹ã·ã§ãŒããŒã§ã®è€éãªèšç®ã¯é¿ããŠãã ãããå¯èœã§ããã°ãäºåã«èšç®ããããã¯ã¹ãã£åº§æšã屿§ãšããŠæž¡ããŸãã
JavaScriptïŒç°¡ç¥çïŒïŒ
// Assuming you have pre-calculated texture coordinates for each vertex
// Vertex data including positions and texture coordinates
é ç¹ã·ã§ãŒããŒïŒæé©åçïŒïŒ
#version 300 es
layout (location = 0) in vec4 a_position;
layout (location = 1) in vec2 a_texCoord;
uniform mat4 u_mvpMatrix;
out vec2 v_texCoord;
void main() {
gl_Position = u_mvpMatrix * a_position;
v_texCoord = a_texCoord;
}
ãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒ
#version 300 es
precision mediump float;
in vec2 v_texCoord;
uniform sampler2D u_texture;
out vec4 fragColor;
void main() {
fragColor = texture(u_texture, v_texCoord);
}
é«åºŠãªãã¯ããã¯ãšå°æ¥ã®ãã¬ã³ã
åºæ¬çãªæé©åãã¯ããã¯ãè¶ ããŠãããã©ãŒãã³ã¹ãããã«åäžãããããšãã§ããé«åºŠãªã¢ãããŒãããããŸãïŒ
1. ã€ã³ã¹ã¿ã³ã·ã³ã°
ã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ãåããªããžã§ã¯ãã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãç°ãªãå€æã§æç»ããããã®åŒ·åãªãã¯ããã¯ã§ããåãªããžã§ã¯ããåå¥ã«æç»ãã代ããã«ãé ç¹ã·ã§ãŒããŒã¯ã€ã³ã¹ã¿ã³ã¹åºæã®ããŒã¿ã䜿çšããŠåã€ã³ã¹ã¿ã³ã¹ãæäœã§ãããããæç»ã³ãŒã«ã®æ°ãå€§å¹ ã«åæžãããŸãã
2. 詳现床ïŒLODïŒ
LODãã¯ããã¯ã¯ãã«ã¡ã©ããã®è·é¢ã«åºã¥ããŠç°ãªãã¬ãã«ã®è©³çްãã¬ã³ããªã³ã°ããããšãå«ã¿ãŸããããã«ãããå¿ èŠãªè©³çްã®ã¿ãã¬ã³ããªã³ã°ãããç¹ã«è€éãªã·ãŒã³ã§ã®GPUã®è² è·ã軜æžãããŸãã
3. ã³ã³ãã¥ãŒãã·ã§ãŒããŒïŒWebGPUã®æªæ¥ïŒ
WebGLã¯äž»ã«ã°ã©ãã£ãã¯ã¹ã¬ã³ããªã³ã°ã«çŠç¹ãåœãŠãŠããŸããããŠã§ãã°ã©ãã£ãã¯ã¹ã®æªæ¥ã«ã¯ãGPUãããæ±çšçãªèšç®ã«äœ¿çšã§ããã³ã³ãã¥ãŒãã·ã§ãŒããŒãå«ãŸããŸããæ¬¡æWebGPU APIã¯ãGPUã«å¯Ÿããããé«åºŠãªå¶åŸ¡ãšãã³ã³ãã¥ãŒãã·ã§ãŒããŒãå«ãããé«åºŠãªæ©èœãæäŸããããšãçŽæããŠããŸããããã«ãããæé©åãšäžŠååŠçã®æ°ããªå¯èœæ§ãéãããŸãã
4. ããã°ã¬ãã·ããŠã§ãã¢ããªïŒPWAïŒãšWebAssemblyïŒWasmïŒ
WebGLãPWAãWebAssemblyãšçµ±åããããšã§ãããã©ãŒãã³ã¹ãããã«åäžããããªãã©ã€ã³ãã¡ãŒã¹ããªäœéšãæäŸã§ããŸããWebAssemblyã䜿çšãããšãéçºè ã¯C++ãªã©ã®èšèªã§èšè¿°ãããã³ãŒãããã€ãã£ãã«è¿ãé床ã§å®è¡ã§ããè€éãªèšç®ãã°ã©ãã£ãã¯ã¹ã¬ã³ããªã³ã°ãå¯èœã«ãªããŸãããããã®æè¡ã掻çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ã¯äžçäžã®ãŠãŒã¶ãŒã«å¯ŸããŠãããäžè²«ããããã©ãŒãã³ã¹ãšé«éãªèªã¿èŸŒã¿æéãå®çŸã§ããŸããã¢ã»ãããããŒã«ã«ã«ãã£ãã·ã¥ããããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã掻çšããããšã¯ãè¯ãäœéšã®ããã«éèŠã§ãã
çµè«
WebGLé ç¹ã·ã§ãŒããŒã®æé©åã¯ã倿§ãªã°ããŒãã«ãªãŒãã£ãšã³ã¹ã«å¯ŸããŠã·ãŒã ã¬ã¹ã§é åçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸãã髿§èœãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãäœæããããã«äžå¯æ¬ ã§ããWebGLãã€ãã©ã€ã³ãçè§£ãããã®ã¬ã€ãã§èª¬æããæé©åãã¯ããã¯ãé©çšããã¯ãã¹ãã©ãããã©ãŒã äºææ§ãåœéåãããã©ãŒãã³ã¹ç£èŠã®ãã¹ããã©ã¯ãã£ã¹ã掻çšããããšã§ãéçºè ã¯å Žæããããã¯ãŒã¯ç¶æ³ã«é¢ä¿ãªããããŸããŸãªããã€ã¹ã§åªããããã©ãŒãã³ã¹ãçºæ®ããã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
ããŸããŸãªã°ããŒãã«åžå Žã§æé©ãªããã©ãŒãã³ã¹ã確ä¿ããããã«ãåžžã«ããŸããŸãªããã€ã¹ãšãããã¯ãŒã¯æ¡ä»¶ã§ã®ããã©ãŒãã³ã¹ãããã¡ã€ãªã³ã°ãšãã¹ããåªå ããããšãå¿ããªãã§ãã ãããWebGLãšãŠã§ããé²åãç¶ããäžã§ããã®èšäºã§è°è«ããããã¯ããã¯ã¯ãåè¶ããã€ã³ã¿ã©ã¯ãã£ããªäœéšãæäŸããããã«äžå¯æ¬ ã§ããç¶ããã§ãããã
ãããã®èŠå ãæ éã«æ€èšããããšã§ããŠã§ãéçºè ã¯çã«ã°ããŒãã«ãªäœéšãåµé ã§ããŸãã
ãã®å æ¬çãªã¬ã€ãã¯ãWebGLã«ãããé ç¹ã·ã§ãŒããŒã®æé©åã®ããã®ç¢ºåºããåºç€ãæäŸããéçºè ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«åŒ·åã§å¹ççãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããããã«ããŸããããã§æŠèª¬ãããæŠç¥ã¯ããŠãŒã¶ãŒã®å Žæãããã€ã¹ã«é¢ä¿ãªããã¹ã ãŒãºã§æ¥œãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãä¿èšŒããã®ã«åœ¹ç«ã¡ãŸãã